코딩테스트 연습 - 두 수의 곱 구하기 | 프로그래머스 스쿨 ss [ 템플릿 코드 ]

#include <string>
#include <vector>
 
using namespace std;
 
int solution(int num1, int num2) {
    int answer = 0;
    return answer;
}

[ 풀이 ]

#include <string>
#include <vector>
 
using namespace std;
 
int solution(int num1, int num2) 
{
    return num1 * num2;
}

[ 해설 ]

#include <string>
#include <vector>
 
using namespace std;
 
int solution(int num1, int num2) 
{
    return num1 * num2;
}

[ 타 답안 ]

#include <iostream> // 입출력을 위한 헤더 포함
using namespace std; // std:: 네임스페이스 생략 설정
 
// 비트 연산을 이용해 두 수의 곱셈을 수행하는 함수
int kake(int a, int b) { 
    int res = 0; // 곱셈의 누적 결과값을 저장할 변수를 0으로 초기화합니다.
    
    // 곱할 수 b가 0보다 큰 동안 계속해서 루프를 돕니다.
    // (b를 계속 절반씩 줄이다가 0이 되면 곱셈이 완료된 것입니다.)
    while (b > 0) { 
        
        // [검사] 만약 b의 맨 오른쪽 비트가 1이라면 (즉, b가 현재 홀수라면)
        if (b & 1) {
            res = res + a; // 현재의 a 값을 결과값(res)에 더해줍니다.
        }
        
        // [변환 1] a를 왼쪽으로 1비트 이동시킵니다.
        // 이것은 이진수 연산으로 a에 곱하기 2를 한 것과 완전히 똑같습니다. (a = a * 2)
        a = a << 1; 
        
        // [변환 2] b를 오른쪽으로 1비트 이동시킵니다.
        // 이것은 이진수 연산으로 b를 2로 나누고 소수점을 버린 것과 똑같습니다. (b = b / 2)
        b = b >> 1; 
    } 
    
    return res; // 최종적으로 누적된 곱셈 결과값을 반환합니다.
} 
 
// 문제를 풀기 위한 최종 솔루션 함수
int solution(int num1, int num2) {
    // num1과 num2를 kake 함수로 전달하여 곱한 결과를 그대로 반환합니다.
    return kake(num1, num2); 
}
  • 초기 상태: a = 7, b = 5, res = 0

  • 1회전: * b가 5(홀수)이므로 if(b & 1) 통과 ➡️ res = 0 + 7 = 7

    • a는 2배 증가 ➡️ a = 14

    • b는 절반으로 감소 ➡️ b = 2

  • 2회전:

    • b가 2(짝수)이므로 if(b & 1) 건너뜀 ➡️ res는 그대로 7

    • a는 2배 증가 ➡️ a = 28

    • b는 절반으로 감소 ➡️ b = 1

  • 3회전:

    • b가 1(홀수)이므로 if(b & 1) 통과 ➡️ res = 7 + 28 = 35

    • a는 2배 증가 ➡️ a = 56

    • b는 절반으로 감소 ➡️ b = 0

  • 종료: b가 0이 되었으므로 while문을 빠져나와 최종 res 값인 35를 반환합니다.

C++ CodingTest